package controlador;

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;

import javax.imageio.ImageIO;

import modelo.Mina;

import vista.VistaMina;
import fiuba.algo3.titiritero.dibujables.SuperficiePanel;
import fiuba.algo3.titiritero.modelo.GameLoop;
import fiuba.algo3.titiritero.modelo.ObservadorDeGameLoop;

public class ObservadorDeMinas implements ObservadorDeGameLoop{
	GameLoop gameLoop;
	protected ArrayList<VistaMina> vistasDeLasMinas;
	
	public ObservadorDeMinas (GameLoop unGameLoop) {
		vistasDeLasMinas = new ArrayList<VistaMina>();
		gameLoop = unGameLoop;
	}

	@Override
	public void notificarCicloFinalizado() {
		@SuppressWarnings("unchecked")
		ArrayList<VistaMina> vistasDeMinasClon = (ArrayList<VistaMina>) vistasDeLasMinas.clone();
		
		Iterator<VistaMina> iteradorDeVistasDeLasMinas = vistasDeMinasClon.iterator();
      	while (iteradorDeVistasDeLasMinas.hasNext()) {
      		VistaMina vistaDeLaMina = iteradorDeVistasDeLasMinas.next();
      		if ((vistaDeLaMina.getMina()).puedeExplotar()) {
	    		gameLoop.remover(vistaDeLaMina);
	    		dibujarExplosiones(vistaDeLaMina.getMina());
	    		iteradorDeVistasDeLasMinas.remove();
			}
      	}
      	vistasDeLasMinas = vistasDeMinasClon;
	}

	private void dibujarExplosiones(Mina unaMina) {
	    BufferedImage imagen = null;
	    
		Graphics grafico = ((SuperficiePanel)gameLoop.getSuperficieDeDibujo()).getBuffer();
		try {
			imagen = ImageIO.read(new URL("file:///" + System.getProperty("user.dir") + "/imagenes/Explosion.png"));
		}
		catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		int filaMina = unaMina.getPosicion().getFila();
		int colMina = unaMina.getPosicion().getColumna();
		int rango = unaMina.getRango();
		// Dibuja las explosiones. Dependiendo del rango, se expande en todas las casillas.
		for (int i = filaMina; i <= filaMina + rango * 2; i++) {
			for (int j = colMina; j <= colMina + rango * 2; j++) {
				// filaE, colE son fila y columna donde la explosion llega.
				int filaE = i - rango;
				int colE = j - rango;
				// Dibuja una explosion en un casillero.
				grafico.drawImage(imagen, (colE) * 50, filaE * 50, null);
			}
		}
	}

	public void agregar(VistaMina vistaMina) {
		vistasDeLasMinas.add(vistaMina);		
	}
}
